#include "Gniazdo.h"

Gniazdo::Gniazdo(void){}

Gniazdo::~Gniazdo(void)
{
      delete k;
      delete [] maszyny;                 
}

Gniazdo::Gniazdo(int _nr, typyKolejki _typ, int _pojemnosc, bool we, bool wy, int lm, int _i, int _j) 
{
     nr = _nr;
     i = _i;
     j = _j;
     k = new Kolejka(_typ, _pojemnosc);
     wejscie = we;
     wyjscie = wy;
     liczbaMaszyn = lm;
	 maszyny = new list<Zadanie*> [lm];
     for (int l=0; l<lm; l++)
		 maszyny[l].clear();
     polaczenia.clear();
}

void Gniazdo::wstawZadanieDoMaszyny(int nrMaszyny, Zadanie *z)
{
	if ( maszyny[nrMaszyny-1].empty())
		maszyny[nrMaszyny-1].push_back(z);
}

int Gniazdo::wstawZadanieDoMaszyny(Zadanie * z)
{
	int nr = -1;
	for (int i=0; i<liczbaMaszyn; i++)
		if (maszyny[i].empty())
		{
			nr = i;
			maszyny[i].push_back(z);
		}
	return nr;
}

Zadanie * Gniazdo::usunZadanieZMaszyny(int nrMaszyny)
{
	Zadanie * z =NULL;
	if (!maszyny[nrMaszyny-1].empty())
	{
		z = maszyny[nrMaszyny-1].front();
		maszyny[nrMaszyny-1].pop_front();
	}
	return z;
}

Zadanie * Gniazdo::getZadanieZMaszyny(int nrMaszyny)
{
	Zadanie * z = NULL;
	if (!maszyny[nrMaszyny-1].empty())
		z = maszyny[nrMaszyny-1].front();
	return z;
}

bool Gniazdo::czyMaszynaZajeta(int nrMaszyny)
{
	if (maszyny[nrMaszyny-1].empty() == true) return false;
	else return true;
}
bool Gniazdo::czySaWolneMaszyny()
{
	bool saWolne = false;
	for (int i=0; i<liczbaMaszyn; i++)
	{
		if (maszyny[i].empty())
		{
			saWolne = true;
			break;
		}
	}
	return saWolne;
}
void Gniazdo::wstawPolaczenie(int nr, int pr)
{
	 struct Polaczenie * p = new Polaczenie();
     p->nrGniazda = nr;
     p->pr = pr;
     polaczenia.push_back(p);
}

Polaczenie* Gniazdo::getPolaczenie(int poz)
{	
	int l = 0;
	for (list<Polaczenie*>::iterator it = polaczenia.begin(); it !=polaczenia.end(); ++it,l++)
	{
		if (l == poz)	return (*it);
	}
    return NULL;
}

void Gniazdo::usunPolaczenie(int nrDo)
{
     Polaczenie * p;
     for (list<Polaczenie*>::iterator it = polaczenia.begin(); it !=polaczenia.end(); ++it)
	{
		if ((*it)->nrGniazda == nrDo)	p = *it;
	}
	if (p != NULL)
	    polaczenia.remove(p);
}

void Gniazdo::edytuj1(typyKolejki _typ, int _pojemnosc, bool we, bool wy, int lm)
{
     liczbaMaszyn = lm;
     maszyny = new list<Zadanie*> [lm];
     k->setTypKolejki(_typ);
     k->setPojemnosc(_pojemnosc);
     wejscie = we;
     wyjscie = wy;
}
